home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
byt86sep.arc
/
SKAM1.BAS
< prev
next >
Wrap
BASIC Source File
|
1980-01-01
|
9KB
|
254 lines
1 '---------------------------------------------------------
2 ' SAMPLE PROGRAM USING KEYED ACCESS ROUTINES -
3 ' --------------------------------------------------------
5 UA$="A" ' .. DRIVE CONTAINING DATA
16 OPEN "R",#2,UA$+":DATA.EMP",84 ' .. OPEN DATA FILE
17 FIELD #2, 9 AS KY$, 20 AS NM$, 6 AS BD$, 1 AS SX$, 3 AS JC$,
20 AS A1$, 20 AS A2$, 5 AS ZP$
18 '
19 ' KY$ - ZIP CODE (KEY) JC$ - JOB CODE
20 ' NM$ - NAME A1$ - STREET ADDR.
21 ' BD$ - BIRTH DATE A2$ - CITY-STATE
22 ' SX$ - SEX ZP$ - ZIP CODE
23 '
25 MX%=150: F1$="PTR.EMP" ' ..INDEX FILE NAME
30 II%=1: GOSUB 2000 ' ..INITIALIZE DATA STRUCTURE
31 '
32 INPUT "OPERATION (D,A,L,S,LA,U,Q)";Q$
33 IF Q$="D" THEN GOSUB 150: GOTO 32 ' DELETE
34 IF Q$="L" THEN GOSUB 180:
GOTO 32 ' LIST INDIVIDUAL DATA
35 IF Q$="A" THEN GOSUB 100: GOTO 32 ' ADD
36 IF Q$="S" THEN II%=8: GOSUB 2000:
GOTO 32 ' DISPLAY STATISTICS
37 IF Q$="LA"THEN GOSUB 200:
GOTO 32 ' LIST ALL RECORDS
38 IF Q$="U" THEN GOSUB 250: GOTO 32 ' UPDATE RECORD
40 IF Q$<>"Q" THEN 32
50 CLOSE: END
97 '
98 ' ***** ADD RECORD
99 '
100 INPUT "SS#";A$ : IF A$="END" THEN 120 ELSE IF
LEN(A$)<>9 THEN 100
101 II%=5:GOSUB 2000: IF RC%<>0 THEN LSET KY$=A$: GOTO 102 ELSE
PRINT"** ERROR - KEY ALREADY EXISTS": GOTO 100
102 INPUT "NAME";F$: LSET NM$=F$
105 INPUT "BIRTH DATE";F$: LSET BD$=F$
107 INPUT "SEX";F$: LSET SX$=F$
109 INPUT "JOB CODE";F$: LSET JC$=F$
110 INPUT "STREET";F$: LSET A1$=F$
111 INPUT "CITY-STATE";F$: LSET A2$=F$
112 INPUT "ZIP CODE";F$: LSET ZP$=F$
115 II%=2: GOSUB 2000 '.. ADD RECORD
116 IF RC%=0 THEN 100 ELSE PRINT"** ERROR - RECORD CANNOT
BE STORED": GOTO 100
120 II%=7: GOSUB 2000 '.. STORE POINTERS
122 RETURN
147 '
148 ' ***** DELETE RECORD
149 '
150 ST%=0
151 INPUT "CODE TO DELETE";A$: IF A$="END" THEN 156
152 II%=4: GOSUB 2000
154 IF RC%=0 THEN ST%=1 ELSE PRINT "** ERROR - KEY DOES NOT
EXIST"
155 GOTO 151
156 IF ST%=1 THEN II%=7: GOSUB 2000 ' RESTORE POINTERS
IF RECORD DELETED
158 RETURN
177 '
178 ' ***** LIST INDIVIDUAL RECORD
179 '
180 INPUT "SOCIAL SECURITY NUMBER";A$: IF A$="END" THEN 190
182 II%=5: GOSUB 2000: IF RC%<>0 THEN PRINT"**ERROR - KEY
DOES NOT EXIST": GOTO 180
183 PRINT " "
184 PRINT " NAME: ";NM$
185 PRINT " JOB CODE: ";JC$
186 PRINT "BIRTH DATE: ";LEFT$(BD$,2);"/";MID$(BD$,3,2);
"/";RIGHT$(BD$,2)
187 PRINT " ADDRESS: ";A1$
188 PRINT TAB(13);A2$:PRINT ""
189 GOTO 180
190 RETURN
197 '
198 ' ***** LIST RANGE OF RECORDS
199 '
200 NX%=0: II%=6: K%=0
202 NX%=NX%+1: GOSUB 2000
204 IF RC%<>0 THEN 210
205 PRINT KY$,NM$
206 K%=K%+1: IF K%<10 THEN 202 ELSE INPUT ">";Q$ ' .. PAUSE
207 IF Q$<>"END" THEN K%=0: GOTO 202
210 RETURN
247 '
248 ' ***** UPDATE RECORD
249 '
250 INPUT "SS#";A$: IF A$="END" THEN 270
252 II%=5:GOSUB 2000 ' .. FETCH RECORD TO BE UPDATED
254 IF RC%=1 THEN PRINT "** ERROR - RECORD DOES NOT EXIST":
GOTO 250
255 PRINT "NAME: /";NM$;"/";: INPUT F$: IF LEN(F$)<>0
THEN LSET NM$=F$
257 PRINT "BIRTH DATE: /";BD$;"/";: INPUT F$: IF LEN(F$)<>0
THEN LSET BD$=F$
258 PRINT "SEX: /";SX$;"/";: INPUT F$: IF LEN(F$)<>0
THEN LSET SX$=F$
260 PRINT "JOB CODE: /";JC$;"/";: INPUT F$: IF LEN(F$)<>0
THEN LSET JC$=F$
262 PRINT "STREET: /";A1$;"/";: INPUT F$: IF LEN(F$)<>0
THEN LSET A1$=F$
263 PRINT "CITY-STATE: /";A2$;"/";: INPUT F$: IF LEN(F$)<>0
THEN LSET A2$=F$
265 PRINT "ZIP CODE: /";ZP$;"/";: INPUT F$: IF LEN(F$)<>0
THEN LSET ZP$=F$
266 II%=3: GOSUB 2000 ' .. RESTORE UPDATED RECORD
268 PRINT " ": GOTO 250
270 RETURN
1995 '
1996 ' -----------------------------------------------------
1997 ' - FILE MANAGEMENT SUBROUTINES
(II%,MX%,F1$,A$,PT%,PT$, NX%,RC%) -
1998 ' -----------------------------------------------------
1999 '
2000 RC%=0: IF II%<1 OR II%>8 THEN RC%=1: RETURN
2001 IF II%=1 THEN 2006: ' ELSE STORE VARIABLES
USED BY SUBROUTINES
2004 ZZ%(1)=J%: ZZ%(2)=JJ%: ZZ%(3)=K%:ZZ%(4)=LO%:
ZZ%(5)=HI%: ZZ%(6)=Z%
2005 '
2006 ON II% GOSUB 2035,2080,2090,2100,2150,2200,2250,2280
2007 '
2008 IF II%=1 THEN 2010: ' ELSE RESTORE VARIABLES
USED BY SUBROUTINES
2009 J%=ZZ%(1): JJ%=ZZ%(2): K%=ZZ%(3): LO%=ZZ%(4): HI%=ZZ%(5):
Z%=ZZ%(6)
2010 RETURN
2034 REM --- (1) SUBROUTINE (MX%,F1$) --- INPUT POINTERS
AND KEYS
2035 IF MX%<1 THEN RC%=1: RETURN
2037 MR%=(INT((MX%+2)/64)+1)*64
2038 DIM PT$(64),PT%(MR%),KE$(MX%),ZZ%(8)
2040 OPEN "R",#1,UA$+":"+F1$,128 ' INDEX FILE
2042 FOR J%=1 TO 64: FIELD #1,(J%-1)*2 AS DU$,
2 AS PT$(J%): NEXT J%
2050 K%=0: IF LOF(1)=0 THEN 2062
2051 FOR J%=1 TO INT(MR%/64)
2052 GET 1,J% ' .. INPUT RECORD CONTAINING 64 POINTERS
2054 FOR JJ%=1 TO 64: K%=K%+1: PT%(K%)=CVI(PT$(JJ%)):
NEXT JJ%
2055 NEXT J%
2056 '
2057 IF PT%(MR%)=0 THEN 2062
2058 FOR J%=1 TO PT%(MR%)+PT%(MR%-1)
2059 GET 2, J%: KE$(J%)=KY$
2060 NEXT J%
2062 RETURN
2079 REM --- (2) SUBROUTINE (MR%,A$, RC%) -- ADD
RECORD TO FILE
2080 GOSUB 2500 : IF K%>0 THEN RC%=1: GOTO 2088
2083 GOSUB 2520 : IF Z%>MR%-1 THEN RC%=2: GOTO 2088
2085 K%=-K%:GOSUB 2540 ' .. INSERT POINTER . PT%(K%)=Z%
2086 KE$(Z%)=A$
2087 PUT 2,Z% ' .. STORE NEW RECORD
2088 RETURN
2089 REM -- (3) SUBROUTINE --- REWRITE RECORD
2090 GOSUB 2500: IF K%<0 THEN RC%=1: GOTO 2098
2092 PUT 2,PT%(K%) ' .. STORE RECORD
2098 RETURN
2099 REM --- (4) SUBROUTINE (MR%,A$,RC%) --- DELETE
A RECORD
2100 GOSUB 2500: IF K%<0 THEN RC%=1: GOTO 2110
2102 Z%=PT%(K%): IF K%=PT%(MR%) THEN 2107
2104 FOR J%=K% TO PT%(MR%)-1: PT%(J%)=PT%(J%+1): NEXT J%
2107 JJ%=PT%(MR%-1)
2108 PT%(PT%(MR%))=0: PT%(MR%)=PT%(MR%)-1:
PT%(MR%-1)=JJ%+1:PT%(MR%-2-JJ%)=Z%
2110 RETURN
2149 REM --- (5) SUBROUTINE (MR%,A$,NX%,RC%) --- READ
RECORD BY KEY
2150 GOSUB 2500: IF K%<0 THEN RC%=1: GOTO 2155
2152 GET 2,PT%(K%) '.. INPUT RECORD
2153 NX%=K%
2155 RETURN
2199 REM --- (6) SUBROUTINE (MR%,NX%,RC%) --- READ
RECORD BY SEQUENCE
2200 IF NX%<0 OR NX%>PT%(MR%) THEN RC%=1: GOTO 2205
2203 GET 2, PT%(NX%)
2205 RETURN
2249 REM --- (7) SUBROUTINE (MR%) --- RESTORE POINTERS
2250 K%=0: Z%=INT((PT%(MR%)-1)/64)+1
2252 FOR J%=1 TO Z%
2253 FOR JJ%=1 TO 64: K%=K%+1:LSET PT$(JJ%)=MKI$(PT%(K%)):
NEXT JJ%: PUT 1,J%
2254 NEXT J%
2255 K%=INT(MR%/64): IF Z%=K% THEN 2259
2257 K%=(K%-1)*64: FOR J%=1 TO 64:
LSET PT$(J%)=MKI$(PT%(J%+K%)):
NEXT J%:PUT 1,INT(MR%/64)
2259 RETURN
2279 REM --- (8) SUBROUTINE -- DISPLAY FILE STATISTICS
2280 PRINT " ":IF PT%(MR%)=0 THEN PRINT "** NO RECORDS
IN FILE": GOTO 2290
2282 PRINT " ** FILE STATISTICS **": PRINT " "
2283 PRINT " 1. RECORDS IN FILE: ";PT%(MR%)
2284 PRINT " 2. DELETED RECORDS: ";PT%(MR%-1)
2285 PRINT " 3. LOWEST KEY: ";KE$(PT%(1))
2286 PRINT " 4. HIGHEST KEY: ";KE$(PT%(PT%(MR%)))
2287 PRINT " "
2290 RETURN
2498 '
2499 REM --- SUBROUTINE (MR%,A$, K%) -- BINARY SEARCH
2500 IF PT%(MR%)=0 THEN K%=-1: RETURN
2502 LO%=0: HI%=PT%(MR%)+1
2504 M%=INT((LO%+HI%)/2)
2505 IF A$=KE$(PT%(M%)) THEN K%=M%: GOTO 2510
2506 IF A$>KE$(PT%(M%)) THEN LO%=M%: ELSE HI%=M%
2508 IF LO%+1 <> HI% THEN 2504 ELSE K%=-HI%
2510 RETURN
2518 '
2519 REM -- SUBROUTINE (MR%,PT%,Z%) -- LOCATE FREE
RECORD IN DATA FILE
2520 IF PT%(MR%-1)=0 THEN Z%=PT%(MR%)+1: GOTO 2530
2522 J%=PT%(MR%):JJ%=PT%(MR%-1)
2524 Z%=PT%(MR%-1-JJ%): PT%(MR%-1)=PT%(MR%-1)-1:
PT%(MR%-1-JJ%)=0
2530 RETURN
2538 '
2539 REM -- SUBROUTINE (MR%,K%,Z%) -- INSERT POINTER
INTO POINTER VECTOR
2540 IF K%=PT%(MR%)+1 THEN 2548
2542 FOR J%=PT%(MR%)+1 TO K%+1 STEP -1
2544 PT%(J%)=PT%(J%-1)
2545 NEXT J%
2548 PT%(K%)=Z%: PT%(MR%)=PT%(MR%)+1
2550 RETURN
2997 ' -----------------------------------------------------
2998 ' - PROGRAM TO INITIALIZE INDEX FILE -
2999 ' -----------------------------------------------------
3000 PRINT " ":PRINT TAB(5);"** INITIALIZE INDEX
FILE **":PRINT " "
3001 INPUT "> DRIVE TO CONTAIN DATA";UA$
3002 INPUT "> FILE NAME";F$
3004 INPUT "> MAXIMUM NUMBER OF RECORDS FILE WILL HOLD";MX%
3006 MR%=(INT((MX%+2)/64)+1)*64
3008 DIM PT$(64)
3009 '--------------------------- OPEN FILE AND SET
POINTERS TO 0
3010 OPEN "R",#1,UA$+":"+F$,128
3012 FOR J%=1 TO 64: FIELD #1,(J%-1)*2 AS DU$,2
AS PT$(J%):NEXT J%
3014 ZR$=MKI$(0): FOR J%=1 TO 64: LSET PT$(J%)=ZR$: NEXT J%
3015 '--------------------------- STORE BLOCKS OF
ZERO POINTERS
3016 FOR J%=1 TO MR%/64
3018 PUT 1,J%
3020 NEXT J%
3022 PRINT " ": PRINT " INITIALIZATION COMPLETE
ON DRIVE";UA$
3025 END